package com.lxm.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lxm.common.contants.CartConstants;
import com.lxm.common.contants.ItemConstants;
import com.lxm.common.tools.ImgUrlUtils;
import com.lxm.common.tools.UserHolder;
import com.lxm.dto.Result;
import com.lxm.entity.Cart;
import com.lxm.entity.Item;
import com.lxm.entity.Login;
import com.lxm.mapper.CartDao;
import com.lxm.service.CartService;
import com.lxm.service.ItemService;
import com.lxm.service.LoginService;
import com.lxm.vo.CartVO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 购物车表 服务实现类
 * </p>
 *
 * @author ${author}
 * @since 2024-10-02
 */
@Service
public class CartServiceImpl extends ServiceImpl<CartDao, Cart> implements CartService {
    @Resource
    private ItemService itemService;
    @Resource
    private LoginService loginService;

    /**
     * 查询购物车列表
     *
     * @return
     */
    //这里还缺一个Redis的Hash存储,这里得好好讨论下
    @Override
    public Result queryCartList() {
        // 根据用户id查询购物车列表
        List<Cart> cartList = lambdaQuery()
                .eq(Cart::getUserId, UserHolder.getUser().getUserId())
                .select(Cart::getCartId, Cart::getItemId,
                        Cart::getItemCount, Cart::getCreateTime)
                .list();
        List<CartVO> cartVOList = cartList
                .parallelStream()
                .map(cart ->
                {
                    // 查询商品信息
                    Item item = itemService
                            .lambdaQuery()
                            .eq(Item::getItemId, cart.getItemId())
                            .select(Item::getTitle, Item::getImg,
                                    Item::getMoney, Item::getUserId)
                            .one();
                    // 封装商品信息到cartVO
                    CartVO cartVO = BeanUtil.toBean(cart, CartVO.class);
                    // 商品的卖家名称 先根据item的userId查询卖家信息再获取卖家名称（昵称）
                    Login userInfo = loginService.getUserInfoLogin(item.getUserId());
                    cartVO.setSellerName(userInfo.getNickName());
                    cartVO.setSellerId(item.getUserId());
                    cartVO.setSellerAvatar(userInfo.getIcon());
                    // 商品标题
                    cartVO.setItemTitle(item.getTitle());
                    // 商品封面  使用工具类解析图片地址，获取第一张图片(因为默认第一张是封面)
                    cartVO.setItemCoverImg(ImgUrlUtils
                            .parseImageCoverUrl(item.getImg()));
                    // 商品单格
                    cartVO.setMoney(item.getMoney());
                    return cartVO;
                })
                .collect(Collectors.toList());

        return Result.ok(cartVOList);
    }

    /**
     * 添加商品到购物车
     *
     * @param itemId
     * @return
     */
    //这里更新数据时也应该查下对应Hash存不存在，存在应该改下字段
    @Override
    public Result addCart(Long itemId, Integer buyNum) {
        // 判断购物车中是否存在该商品
        Cart cart = lambdaQuery()
                .eq(Cart::getUserId, UserHolder.getUser().getUserId())
                .eq(Cart::getItemId, itemId)
                .one();
        if (!ObjUtil.isEmpty(cart)) {
            // 存在，则先检查库存数量是否大于购物车的数量，足够则更新数量
            if (!itemService.checkItemNumEnough(itemId, cart.getItemCount() + buyNum))
                return Result.fail(ItemConstants.STACK_NOT_ENOUGH);
            // 更新数量
            cart.setItemCount(cart.getItemCount() + buyNum);
            updateById(cart);
            return Result.ok();
        }
        // 不存在，则添加一个购物车记录把商品数量设置为1
        cart = new Cart();
        cart.setUserId(UserHolder.getUser().getUserId());
        cart.setItemId(itemId);
        cart.setItemCount(buyNum);
        save(cart);

        return Result.ok();
    }

    /**
     * 移除单个或多个或者清空购物车
     *
     * @param cartIds
     * @return
     */


    @Override
    public Result deleteItem(List cartIds) {
        Long userId = UserHolder.getUser().getUserId();
        if (CollUtil.isEmpty(cartIds)) return Result.fail(CartConstants.CART_DELETE_FAIL);
        boolean isSuccess = remove(new LambdaQueryWrapper<Cart>()
                .eq(Cart::getUserId, userId)
                .in(Cart::getCartId, cartIds));
        return isSuccess ? Result.ok() : Result.fail(CartConstants.CART_DELETE_FAIL);
    }


    /**
     * 根据itemId修改购物车商品数量
     *
     * @param cartId
     * @param buyNum
     * @return
     */
    @Override
    public Result updateItemNum(Long cartId, Integer buyNum) {
        // 根据itemId更新购物车商品数量
        if (!itemService.checkItemNumEnough(cartId, buyNum)) return Result
                .fail(ItemConstants.STACK_NOT_ENOUGH);
        boolean isSuccess = lambdaUpdate()
                .set(Cart::getItemCount, buyNum)
                .eq(Cart::getCartId, cartId)
                .eq(Cart::getUserId, UserHolder.getUser().getUserId())
                .update();
        return isSuccess ? Result.ok() : Result.fail(CartConstants.CART_UPDATE_FAIL);
    }
}
